1 //+------------------------------------------------------------------+
\r
2 //| MACD Sample.mq4 |
\r
3 //| Copyright © 2005, MetaQuotes Software Corp. |
\r
4 //| http://www.metaquotes.net/ |
\r
5 //+------------------------------------------------------------------+
\r
7 extern double TakeProfit = 50;
\r
8 extern double Lots = 0.1;
\r
9 extern double TrailingStop = 30;
\r
10 extern double MACDOpenLevel=3;
\r
11 extern double MACDCloseLevel=2;
\r
12 extern double MATrendPeriod=26;
\r
14 //+------------------------------------------------------------------+
\r
16 //+------------------------------------------------------------------+
\r
19 double MacdCurrent, MacdPrevious, SignalCurrent;
\r
20 double SignalPrevious, MaCurrent, MaPrevious;
\r
21 int cnt, ticket, total;
\r
22 // initial data checks
\r
23 // it is important to make sure that the expert works with a normal
\r
24 // chart and the user did not make any mistakes setting external
\r
25 // variables (Lots, StopLoss, TakeProfit,
\r
26 // TrailingStop) in our case, we check TakeProfit
\r
27 // on a chart of less than 100 bars
\r
30 Print("bars less than 100");
\r
35 Print("TakeProfit less than 10");
\r
36 return(0); // check TakeProfit
\r
38 // to simplify the coding and speed up access
\r
39 // data are put into internal variables
\r
40 MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
\r
41 MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
\r
42 SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
\r
43 SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
\r
44 MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
\r
45 MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
\r
47 total=OrdersTotal();
\r
50 // no opened orders identified
\r
51 if(AccountFreeMargin()<(1000*Lots))
\r
53 Print("We have no money. Free Margin = ", AccountFreeMargin());
\r
56 // check for long position (BUY) possibility
\r
57 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
\r
58 MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
\r
60 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
\r
63 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
\r
65 else Print("Error opening BUY order : ",GetLastError());
\r
68 // check for short position (SELL) possibility
\r
69 if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
\r
70 MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
\r
72 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
\r
75 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
\r
77 else Print("Error opening SELL order : ",GetLastError());
\r
82 // it is important to enter the market correctly,
\r
83 // but it is more important to exit it correctly...
\r
84 for(cnt=0;cnt<total;cnt++)
\r
86 OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
\r
87 if(OrderType()<=OP_SELL && // check for opened position
\r
88 OrderSymbol()==Symbol()) // check for symbol
\r
90 if(OrderType()==OP_BUY) // long position is opened
\r
92 // should it be closed?
\r
93 if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
\r
94 MacdCurrent>(MACDCloseLevel*Point))
\r
96 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
\r
99 // check for trailing stop
\r
100 if(TrailingStop>0)
\r
102 if(Bid-OrderOpenPrice()>Point*TrailingStop)
\r
104 if(OrderStopLoss()<Bid-Point*TrailingStop)
\r
106 OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
\r
112 else // go to short position
\r
114 // should it be closed?
\r
115 if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
\r
116 MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
\r
118 OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
\r
121 // check for trailing stop
\r
122 if(TrailingStop>0)
\r
124 if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
\r
126 if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
\r
128 OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
\r